﻿#pragma once


#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <stdbool.h>

#define WALL L'□'
#define BODY L'●'
#define FOOD L'★'


//蛇默认的起始坐标
#define POS_X 24
#define POS_Y 5

#define KEY_PRESS(VK)  ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

//游戏的状态
enum GAME_STATUS
{
	OK = 1,//正常运行
	ESC, //按了ESC键退出，正常退出
	KILL_BY_WALL,//撞墙
	KILL_BY_SELF //撞到自身
};

//蛇行走的方向
enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};

//蛇身结点的定义
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode, * pSnakeNode;


//贪吃蛇
typedef struct Snake
{
	pSnakeNode pSnake;//维护整条蛇的指针，是指向蛇头
	pSnakeNode pFood;//指向食物的指针
	int Score;//当前累积的分数
	int FoodWeight;//一个食物的分数
	int SleepTime;//蛇休眠的时间，休眠的时间越短，蛇的速度越快，休眠的时间越长，蛇的速度越慢
	enum GAME_STATUS status;//游戏当前的状态
	enum DIRECTION dir;//蛇当前走的方向
	//...
}Snake, * pSnake;


//定位控制台光标位置
void SetPos(int x, int y);

//游戏开始前的准备
void GameStart(pSnake ps);

//打印欢迎界面
void WelcomeToGame();

//绘制地图
void CreateMap();

//初始化贪吃蛇
void InitSnake(pSnake ps);

//创建食物
void CreateFood(pSnake ps);

//游戏运行的整个逻辑
void GameRun(pSnake ps);

//打印帮助信息
void PrintHelpInfo();

//蛇移动的函数- 每次走一步
void SnakeMove(pSnake ps);

//判断蛇头的下一步要走的位置处是否是食物
int NextIsFood(pSnake ps, pSnakeNode pNext);

//下一步要走的位置处就是食物，就吃掉食物
void EatFood(pSnake ps, pSnakeNode pNext);

//下一步要走的位置处不是食物，不吃食物
void NotEatFood(pSnake ps, pSnakeNode pNext);

//检测是否撞墙
void KillByWall(pSnake ps);

//检测是否撞自己
void KillBySelf(pSnake ps);

//游戏结束的资源释放
void GameEnd(pSnake ps);

